02 控制流
程序不能只是从上到下执行一遍就结束,你需要根据条件做不同的事情,需要重复执行某些操作。if做条件判断,for和while做循环,match做模式匹配——这三个是Python控制流的核心。
一、if语句
1.1 基本语法
python
>>> x = int(input("请输入一个整数: "))
请输入一个整数: 42
>>> if x < 0:
... x = 0
... print('负数变为零')
... elif x == 0:
... print('零')
... elif x == 1:
... print('一')
... else:
... print('更多')
更多elif是else if的缩写。if...elif...elif...可以串很多个,最后的else可选。
1.2 条件表达式
Python没有switch语句(3.10之前),用if...elif...else替代。条件不需要括号,但语句末尾的冒号不能少。
二、for循环
2.1 遍历序列
Python的for循环和C语言不同,它不自己管理索引,而是直接遍历序列里的元素:
python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 122.2 遍历时修改列表
遍历列表时如果要修改列表本身(比如删除元素),不要直接遍历原列表,先复制一份:
python
>>> words = ['cat', 'window', 'defenestrate']
>>> for w in words[:]: # 遍历副本
... if len(w) > 6:
... words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']直接遍历words并修改它,结果是不可预测的。
三、range()函数
3.1 基本用法
需要遍历一个数字序列时,用range():
python
>>> for i in range(5):
... print(i)
...
0
1
2
3
43.2 指定起止和步长
python
>>> for i in range(5, 10):
... print(i)
...
5
6
7
8
9
>>> for i in range(0, 10, 3):
... print(i)
...
0
3
6
9
>>> for i in range(-10, -100, -30):
... print(i)
...
-10
-40
-70range(start, end, step)——起始值(默认0)、结束值(不含)、步长(默认1)。
3.3 配合len()遍历索引
python
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb不过大多数时候用enumerate()更优雅。
3.4 range转列表
python
>>> list(range(5))
[0, 1, 2, 3, 4]四、break、continue和else
4.1 break和continue
break跳出循环,continue跳过当前迭代:
python
>>> for n in range(2, 10):
... if n % 2 == 0:
... print(f"发现偶数: {n}")
... continue
... print(f"发现奇数: {n}")
发现偶数: 2
发现奇数: 3
发现偶数: 4
发现奇数: 5
发现偶数: 6
发现奇数: 7
发现偶数: 8
发现奇数: 94.2 循环的else子句
for和while循环可以有else子句,当循环正常结束(没被break中断)时执行:
python
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, '等于', x, '*', n//x)
... break
... else:
... # 循环正常结束,说明没找到因子
... print(n, '是质数')
...
2 是质数
3 是质数
4 等于 2 * 2
5 是质数
6 等于 2 * 3
7 是质数
8 等于 2 * 4
9 等于 3 * 3如果被break中断,else不会执行。
五、while循环
5.1 基本用法
python
>>> a, b = 0, 1
>>> while a < 10:
... print(a, end=' ')
... a, b = b, a+b
...
0 1 1 2 3 5 85.2 死循环
python
>>> while True:
... response = input('输入quit退出: ')
... if response == 'quit':
... break
...
输入quit退出: hello
输入quit退出: quit六、pass语句
pass什么都不做,用于语法上需要语句但逻辑上不需要做任何事的场合:
python
>>> while True:
... pass # 忙等待,按Ctrl+C退出
>>> class MyEmptyClass:
... pass
>>> def init_log():
... pass # 还没实现,先占位七、match语句(3.10+)
7.1 基本匹配
python
>>> status = 404
>>> match status:
... case 200:
... print("OK")
... case 404:
... print("Not Found")
... case 500:
... print("Server Error")
... case _:
... print("Unknown")
...
Not Found_是通配符,匹配任何值。
7.2 解构匹配
python
>>> point = (1, 0)
>>> match point:
... case (0, 0):
... print("原点")
... case (x, 0):
... print(f"X轴上,x={x}")
... case (0, y):
... print(f"Y轴上,y={y}")
... case (x, y):
... print(f"点({x}, {y})")
...
X轴上,x=17.3 匹配字典
python
>>> action = {"type": "move", "x": 10, "y": 20}
>>> match action:
... case {"type": "move", "x": x, "y": y}:
... print(f"移动到({x}, {y})")
... case {"type": "click", "target": target}:
... print(f"点击{target}")
...
移动到(10, 20)7.4 守卫条件
python
>>> point = (1, 1)
>>> match point:
... case (x, y) if x == y:
... print(f"在对角线上,x=y={x}")
... case (x, y):
... print(f"点({x}, {y})")
...
在对角线上,x=y=1if后面是守卫条件,只有模式匹配且条件为真时才进入该分支。
八、总结
| 语句 | 用途 |
|---|---|
if/elif/else | 条件判断 |
for | 遍历序列 |
while | 条件循环 |
range() | 生成数字序列 |
break | 跳出循环 |
continue | 跳过当前迭代 |
else(循环) | 循环正常结束时执行 |
pass | 占位符 |
match/case | 模式匹配(3.10+) |
for循环直接遍历元素,不需要手动管理索引。range()生成数字序列。循环的else子句在没被break中断时执行。match是3.10新增的,支持解构和守卫条件。